<?php

/**
 * 基本使用
 * https://www.php.net/manual/zh/book.session.php
 */

// 设置 注意需要在 session_start 前面

// // 读取/设置当前会话的保存路径
// session_save_path('session');
// echo session_save_path();
//
// // 读取/设置会话名称
// session_name('name');
// echo session_name();
//
// // 获取/设置当前会话 ID
// session_id('id');
// echo session_id();

// 开启会话
// session_start();
//
// // 存储数据
// $_SESSION['web'] = 'test';
//
// // 删除session
// unset($_SESSION['web']);
// $_SESSION = [];
// session_destroy();

/**
 * 自定义 session 会话存储类
 * https://www.php.net/manual/zh/function.session-set-save-handler.php
 * FileSessionHandler 文件
 */
class FileSessionHandler implements SessionHandlerInterface
{
    protected $path;

    protected $minutes;

    /**
     * FileSessionHandler constructor.
     * @param string $path
     * @param int $minutes
     */
    public function __construct(string $path, int $minutes = 1440)
    {
        $this->path = $path;
        $this->minutes = $minutes;
    }

    public function close()
    {
        return true;
    }

    public function destroy($id)
    {
        if (is_file($this->path . '/' . $id)) {
            @unlink($this->path . '/' . $id);
        }

        return true;
    }

    public function gc($max_lifetime)
    {
        $files = glob($this->path . '/*');

        foreach ($files as $file) {
            if (filemtime($file) <= time() - $this->minutes) {
                @unlink($file);
            }
        }
    }

    public function open($path, $name)
    {
        if (!is_dir($this->path)) {
            mkdir($this->path, 0755, true);
        }
        return true;
    }

    public function read($id)
    {
        return (string)file_get_contents($this->path . '/' . $id);
    }

    public function write($id, $data)
    {
        return (bool)file_put_contents($this->path . '/' . $id, $data, true ? LOCK_EX : 0);
    }
}

$handler = new FileSessionHandler('session');
session_set_save_handler($handler, true);
session_start();
